package com.servlet3.test;

import com.servlet3.service.HelloService;

import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import java.util.EnumSet;
import java.util.Set;

/**
 * @author lzy
 * @version v1.0
 * Create DateTime: 2018/12/9 16:08
 * <p>
 * 容器启动的时候会将@HandlesTypes指定的这个类型下面的子类（实现类，子接口等）传递过来
 * 传入感兴趣的类型
 */
@HandlesTypes(value = {HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {
    /**
     * 应用启动的时候，会运行onStartup方法
     * ServletContext：代表当前Web应用的ServletContext，一个Web应用对应于一个ServletContext
     * Set<Class<?>
     * <p>
     * 1.使用ServletContext注册WEB组件：Servlet，Filter，Listener
     * 2.使用编码的方式，在项目启动的时候给ServletContext里面添加组件：
     * 必须在项目启动的时候来添加
     * ①ServletContainerInitializer得到的ServletContext
     * ②ServletContextListener中通过ServletContextEvent得到的ServletContext
     *
     * @param c
     * @param ctx
     * @throws ServletException
     */
    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        System.out.println("感兴趣的类型：");
        c.forEach(System.out::println);

        //注册组件
        ServletRegistration.Dynamic servlet = ctx.addServlet("userServlet", new UserServlet());
        servlet.addMapping("/user");

        //注册listener
        ctx.addListener(UserListener.class);

        //注册filter
        FilterRegistration.Dynamic filterRegistration = ctx.addFilter("userFilter", "com.servlet3.test.UserFilter");
        //添加filter的映射信息
        filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
    }
}
